#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/input.h>

// 定义一个结构体存放读取到的触摸屏信息
struct input_event touch;

int main()
{

    // 打开LCD文件
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd == -1)
        perror("open lcd error");

    // open event0
    int ts = open("/dev/input/event0", O_RDONLY);
    if (ts == -1)
    {
        printf("打开触摸屏失败！\n");
        return -1;
    }

    int *lcd_p = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);
    if (lcd_p == NULL)
        perror("mmap error");


    int t_x, t_y;
    while (1) // 循环读取
    {
        read(ts, &touch, sizeof(touch)); // 没触摸的时候。read是堵塞的
        if (touch.type == EV_ABS && touch.code == ABS_X)
            t_x = touch.value * 800 / 1024; // 判断是不是触摸屏设备，在判断是不是x坐标，
        if (touch.type == EV_ABS && touch.code == ABS_Y)
            t_y = touch.value * 480 / 600;
        // if (touch.type == EV_KEY && touch.code == BTN_TOUCH && touch.value == 0)//判断是否手离开
        // {
            printf("x:%d--y:%d\n", t_x, t_x); // 黑板
            for (int y = 0; y < 480; y++)
            {
                for (int x = 0; x < 800; x++)
                {
                    if ((x - t_x) * (x - t_x) + (y - t_y) * (y - t_y) <= 10 * 10)
                    {
                        *(lcd_p + x + y * 800) = 0x00000000; // 写入单像素点
                    }
                    else
                    {
                        *(lcd_p + x + y * 800) = 0x00FFFFFF; // 写入单像素点
                    }
                }
            }
        // }
    }

    close(ts);

    // 释放空间
    munmap(lcd_p, 800 * 480 * 4);
    return 0;
}